package com.study.algorithm.linkedList;

public class LinkedListReverser {
    //迭代
    public ListNode reverseList(ListNode head) {
        // 初始化前驱节点为null（反转后头节点的next应为null）
        ListNode prev = null;
        // 当前节点从head开始
        ListNode curr = head;

        // 遍历链表直到末尾
        while (curr != null) {
            // 1. 临时保存下一个节点（避免丢失后续链表）
            ListNode nextTemp = curr.next;

            // 2. 反转指针方向：当前节点指向前驱节点
            curr.next = prev;

            // 3. 移动双指针：前驱和当前节点各前进一步
            prev = curr;
            curr = nextTemp;
        }

        // 循环结束时，prev指向原链表的尾节点（即新头节点）
        return prev;
    }

    //递归
    public static ListNode reverseList2(ListNode head) {
        // 递归终止条件：当前节点为空或已经是最后一个节点
        if (head == null || head.next == null) {
            return head;
        }
        // 递归调用：先反转后续链表，并获取新的头节点
        ListNode newHead = reverseList2(head.next);

        // 关键操作：将当前节点的下一个节点指向自己（反转方向）
        head.next.next = head;
        // 断开原有指向，避免形成环
        head.next = null;

        // 始终返回新头节点（原链表的尾节点）
        return newHead;
    }

    public static void main(String[] args) {
        // 创建链表
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);

        System.out.println(reverseList2(head));
    }
}
